package kr.co.bettersoft.pushchat.activity;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import kr.co.bettersoft.pushchat.activity.DiaryDetailActivity.RunnableRegisterBlock;
import kr.co.bettersoft.pushchat.activity.DiaryDetailActivity.backgroundRunnableRegisterBlock;
import kr.co.bettersoft.pushchat.activity.LoginActivity.RunnableLogin;
import kr.co.bettersoft.pushchat.activity.LoginActivity.backgroundThreadLogin;
import kr.co.bettersoft.pushchat.adapter.ChatRoomMessageListAdapter;
import kr.co.bettersoft.pushchat.common.CommonConstant;
import kr.co.bettersoft.pushchat.common.CommonUtil;
import kr.co.bettersoft.pushchat.common.PushChatRest;
import kr.co.bettersoft.pushchat.domain.ChatMember;
import kr.co.bettersoft.pushchat.domain.ChatMessage;
import kr.co.bettersoft.pushchat.domain.ChatRoom;
import kr.co.bettersoft.pushchat.domain.ImageFile;
import kr.co.bettersoft.pushchat.domain.PushChatBlock;
import kr.co.bettersoft.pushchat.domain.PushChatChat;
import kr.co.bettersoft.pushchat.domain.PushChatMember;
import kr.co.bettersoft.pushchat.domain.PushChatMessage;
import kr.co.bettersoft.pushchat.domain.PushChatRecognition;
import kr.co.bettersoft.pushchat.domain.PushChatUser;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
/**
 * ChatRoomActivity
 * 채팅방.
 * 
 * 화면 상중단에는 채팅내역이 나오고
 * 하단에 채팅 입력창이 있다.
 * 
 * 채팅을 입력하면 푸시 메시지를 통해 화면이 갱신된다.
 * @author blue
 *
 */
public class ChatRoomActivity extends Activity{
	/////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수

	String TAG = "ChatRoomActivity";

	static int REQUEST_PICTURE = 1;			// 사진 가져오기
	static int REQUEST_PHOTO_ALBUM = 2;		// 사진 찍기

	//		public final boolean IMAGE_ROUND_SETTING = true;
	CommonUtil commonUtil = new CommonUtil();

	public String year;
	public String month ;
	public String day;
	public String hour ;
	public String minute;
	public SimpleDateFormat sfGeneral ;
	public SimpleDateFormat sfGeneral2 ;
	public SimpleDateFormat sfGeneralChat;

	//static 
	public final int MAX_WIDTH = CommonConstant.UPLOAD_IMAGE_SIZE_BIG;				// 업로드 이미지 큰변 길이 800
	public final int MAX_HEIGHT = CommonConstant.UPLOAD_IMAGE_SIZE_SMALL;			// 업로드 이미지 작은변 길이 600
	String SAMPLEIMG = commonUtil.getNowDateForImage()+".png";  

	public final int COUNT_OF_SHOW_CHAT_MESSAGE_AT_ONE_TIME = 20;				// 한번에 보여줄 메시지 개수 		
	Context mContext = this;
	//button 클릭
	Dialog dialog;

	
	public final int SELECT_CHAT_INFORMATION = 301;				// RestSelectChatInformation	// 채팅방 정보얻기	selectChatInformation
	public final int SELECT_USER_INFORMATION = 302;		// 채팅방 사용자 고유 키값 받기
	public final int REGISTER_BLOCK = 303;				// RestRegisterBlock	// 사용자 차단		registerBlock
	
	public final int REGISTER_MESSAGE = 401;		// 메시지 작성.
	public final int REGISTER_MESSAGE_WITH_IMAGE = 402;		// 메시지 + 이미지 작성.
	public final int SELECT_MESSAGE_LIST = 403;		// 메시지 리스트 가져오기.
	
	public static Activity chatRoomActivity;

	SharedPreferences sharedPrefCustom;	// 공용 프립스	
	int isRunning = 0;		// 통신 도중 중복 호출을 방지하기 위함.

	// 사용자 아이디
	String userId = "";
	// 채팅방에서 발급한 사용자 키값		
	//	String idUser = "";

	// 전달받은 정보
	String recievedIdChat = "";
	String recievedOwner = "";
	String recievedOtherUserId = "";		
	String recievedOthersNickName = "";

	String idUserFromServer = "";
	String chatChatIdChatFromServer = "";	
	String chatChatOwnerFromServer = "";		


	// 서버 통신 용
	PushChatRest pushChatRest;
	Boolean loading = false;
	// 통신 결과
	String resultStr = "";


	// 채팅방 유저 정보
	PushChatUser pushChatUser;
	// 채팅방 정보
	PushChatChat pushChatChat;

	// 채팅 리스트 최초 조회한 정보. (이미지 제외)
	List<PushChatMessage> entries1;
	List<PushChatMessage> entriesFn = new ArrayList<PushChatMessage>();				// 최종 꺼내어 화면에 보여줄 값

	// 캐럿때에는 가장 하단에 내려갈때 추가 조회했지만 채팅에서는 상단으로 올라갔을때 추가 조회를 해야 함.. 위치는 현위치를 유지해야 하고..
	int indexDataFirst = 0;			// 부분 검색 위한 인덱스. 시작점
	int indexDataLast = 0;			// 부분 검색 위한 인덱스. 끝점
	int indexDataTotal = 0;			// 부분 검색 위한 인덱스. 현재 서버에서 조회된 전체 개수. 사이즈이지만 추가 데이터를 위해 인덱스로 사용
	Boolean mIsFirst = false;			// 가장 처음까지 갔음. true 라면 더이상의 추가 없음. 새 조회시 false 로 초기화
	Boolean adding = false;			// 데이터 더하기 진행 중임.
	Boolean newSearch = false; 		// 새로운 조회인지 여부. 새로운 조회라면 기존 데이터는 지우고 새로 검색한 데이터만 사용. 새로운 조회가 아니라면 기존 데이터에 추가 데이터를 추가.

	// 임시 저장 데이터
	String tmp_pushChatUserMemberId = "";		// 채팅 글 작성자 아이디? 채팅 메시지 고유 번호?
	String tmp_content = "";					// 채팅 글 내용
	String tmp_registerDate = "";				// 채팅 메시지 작성 시각
	String tmp_nickName = "";					// 채팅글 작성한 사람의 닉네임
	String tmp_fileUrl = "";					// 업로드 이미지 URL
	String tmp_thumbnailUrl = "";				// 업로드 이미지 썸네일 URL
	String tmp_profileImageUrl = "";			// 프로필 이미지 URL
	String tmp_profileThumbnailUrl = "";		// 프로필 썸네일 이미지 URL

	String tmp_prevImageUrl = "";				// 프로필 이미지 반복 로딩 막기 위한 저장용 URL
	Bitmap tmp_prevImage = null;				// 프로필 이미지 반복 로딩 막기 위한 저장용 이미지

	Bitmap tmp_uploadFileImg = null;			// 업로드 이미지
	Bitmap tmp_uploadFileThumbnailImg = null;	// 업로드 썸네일 이미지
	Bitmap tmp_profileImg = null;				// 프로필 이미지
	Bitmap tmp_profileThumbnailImg = null;		// 프로필 썸네일 이미지
	String tmp_myMessageYn = "";				// 내 글인지 여부

	Bitmap mySelectedImage = null;		// 채팅방에서 사용자가 선택 또는 촬영한 이미지



	// 리스트 아답터
	ChatRoomMessageListAdapter chatRoomMessageListAdapter;

	// 화면 구성 	
	TextView chatRoomTitle; 	// 상단 타이틀
	Button topNaviCloseBtn; 		// 상단 닫기 버튼
	Button topNaviBlockBtn; 		// 상단 차단 버튼
	ListView listView;			// 채팅 내용 리스트 뷰					 
	View emptyView;				// 채팅 내용 없음 뷰
	EditText userChatTextField;		// 채팅 입력창
	Button image_send_btn;				// 사진 첨부 버튼
	Button sendBtn;				// 채팅 내용 전송 버튼
	ProgressBar pb1;			// 중단 로딩 진행바
	String userInputText = "";		// 사용자가 입력한 텍스트

	//		ImageView upload_img_view;		// 업로드 이미지 크게보기 뷰

	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;

	//////////////////////////////////////////////////////////////////////////////////////////////////////	

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				// 상단 타이틀 문구 변경
				if(b.getInt("titleChange")==1){
					chatRoomTitle.setText(recievedOwner+getString(R.string.whos_chat_room));
				}
				if(b.getInt("showYN")==1){
					listView.setVisibility(View.VISIBLE);
					// 최종 결과 배열은 entriesFn 에 저장되어 있다
					if(entriesFn!=null && entriesFn.size()>0){
						//							if(isFirstGetList){
						if(newSearch){
							setListing();
							newSearch = false;		// 다시 돌려놓는다. 이제는 최초 검색이 아님.
							// 마지막 위치로 ?
							listView.setSelection(listView.getAdapter().getCount()-1);
						}else{
							chatRoomMessageListAdapter.notifyDataSetChanged();	// 위치 변경 없음. 유지.
						}
					}else{
						Log.d(TAG,"no data");
						listView.setEmptyView(emptyView);
					}
					adding = false;		// 조회 및 추가 끝났음. 다른거 조회시 또 추가 가능.. (스크롤 리스너를 다룰때 사용)
					isRunning = 0;
				}

				// 리스트 숨김
				if(b.getInt("showYN")==2){
					listView.setVisibility(View.INVISIBLE);
				}

				// 입력창 초기화
				if(b.getInt("initTextField")==1){

					userChatTextField.setText("");
				}

				//					// 업로드 이미지 상세 보기
				//					if(b.getInt("showUploadImage")==1){
				//						upload_img_view.setImageBitmap(temp_upload_img);
				//				  		upload_img_view.setVisibility(View.VISIBLE);
				//					}

				// 화면에 토스트
				if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기. 띄우는 문구는 msg 로 받은 값
					Toast.makeText(ChatRoomActivity.this, R.string.error_message, Toast.LENGTH_SHORT).show();
				}
				// 화면에 알림창
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							 
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("confirmBlock")==1){					 // 사용자 차단 확인
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							handler.sendEmptyMessage(REGISTER_BLOCK);
						}})
						.setNegativeButton(android.R.string.no, null).show();
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					pb1.setVisibility(View.INVISIBLE);
				}

				switch (msg.what)
				{
				case REGISTER_MESSAGE : runOnUiThread(new RunnableRegisterMessage());				 
				break;
				case REGISTER_MESSAGE_WITH_IMAGE : runOnUiThread(new RunnableRegisterMessageWithImage());			 
				break;
				case SELECT_MESSAGE_LIST : runOnUiThread(new RunnableSelectMessageList());				 
				break;
				case SELECT_USER_INFORMATION : runOnUiThread(new RunnableSelectUserInformation());		 
				break;
				case SELECT_CHAT_INFORMATION   : runOnUiThread(new RestSelectChatInformation());			
				break;
				case REGISTER_BLOCK   : runOnUiThread(new RunnableRegisterBlock());			
				break;
				default : 
					break;
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.d(TAG,"onCreate");
		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.chat_room_activity);
		Log.w(TAG,"ChatRoomActivity onCreate");

		// 레이아웃의 개체들을 가져와서 사용
		chatRoomTitle = (TextView) findViewById(R.id.chat_room_title);		// 상단 타이틀
		listView  = (ListView)findViewById(R.id.listview);		// 채팅 리스트 뷰
		emptyView = findViewById(R.id.empty2);								// 채팅 내역 없음 뷰
		userChatTextField =  (EditText) findViewById(R.id.chat_room_chat_text_field);	// 입력 창
		image_send_btn = (Button) findViewById(R.id.image_send_btn);									// 전송 버튼
		sendBtn = (Button) findViewById(R.id.send_btn);									// 전송 버튼
		pb1=(ProgressBar) findViewById(R.id.ProgressBar01);					// 프로그래스 바

		// 상단 닫기 버튼
		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.d(TAG,"topNaviCloseBtn clicked");
				finish();
			}
		});
		// 상단 차단 버튼		
		topNaviBlockBtn = (Button) findViewById(R.id.top_navi_block_btn);
		topNaviBlockBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.d(TAG,"topNaviBlockBtn clicked");
				confirmBlock();
			}
		});

		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout = findViewById(R.id.chat_room_parent_layout);			// 부모 레이아웃. 리스너 달아서 키보드 숨김에 사용
		imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.w(TAG,"parentLayout click");
				hideKeypad();
			}
		});
		// 리스트 영역을 터치해도 키패드 사라지도록.
		listView.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				hideKeypad();
			}
		});
		sendBtn.setOnClickListener(new OnClickListener() {			// 전송 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"sendBtn click");
				hideKeypad();
				userInputText = userChatTextField.getText()+"";
				if(mySelectedImage==null){
					if(userInputText.length()>0){
						handler.sendEmptyMessage(REGISTER_MESSAGE);
					}
				}else{
					handler.sendEmptyMessage(REGISTER_MESSAGE_WITH_IMAGE);
				}

			}
		});
		
		
		// 프립
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);

		chatRoomActivity = ChatRoomActivity.this;		// GCM 푸시 메시지를 통한 리프레시 가능하도록 자신을 전달
		pushChatRest = new PushChatRest();				// 통신용

		Intent recievedIntent = getIntent();
		recievedIdChat = recievedIntent.getStringExtra("idChat");		// 채팅방 고유 번호
		recievedOwner = recievedIntent.getStringExtra("owner");			// 방장 아이디
		recievedOtherUserId = recievedIntent.getStringExtra("otherUserId");			//
		recievedOthersNickName = recievedIntent.getStringExtra("othersNickName");			// 
		if(recievedOtherUserId==null || recievedOtherUserId.equals("null") || recievedOtherUserId.length()<1){
			topNaviBlockBtn.setVisibility(View.INVISIBLE);
		}else{
			topNaviBlockBtn.setVisibility(View.VISIBLE);
		}
		
		SharedPreferences.Editor saveChatRoomStatusPref = sharedPrefCustom.edit();
		saveChatRoomStatusPref.putBoolean("chatRoomUsingYn", true);			   		// 채팅방 사용중. (푸시를 통한 리프레시 기능을 위해 필요)	
		saveChatRoomStatusPref.putString("currentChatRoomId", recievedIdChat);		//  위의 두 값이 바뀐후 리프레시한다면 채팅방이 바뀌는 효과.(타이틀도 바꿔야)
		saveChatRoomStatusPref.putString("currentChatRoomOwner", recievedOwner);	//  그에 따른 변수도 함께 바껴야 (최초 조회 여부 관련) 	
		saveChatRoomStatusPref.commit();

		titleChange();


		// 사용자 아이디 꺼내기
		userId = sharedPrefCustom.getString("userId", "");	
		if(userId.length()==0){
			Log.d(TAG,"no saved userId");
			finish();
		}

		

		year = returnThis().getString(R.string.year);
		month = returnThis().getString(R.string.month);
		day = returnThis().getString(R.string.day);
		hour = returnThis().getString(R.string.hour);
		minute = returnThis().getString(R.string.minute);
		sfGeneral = new SimpleDateFormat("yyyy"+year+" MM"+month+" dd"+day+" a hh"+hour+" mm"+minute);
		sfGeneral2 = new SimpleDateFormat("yyyy"+year+" MM"+month+" dd"+day+" HH"+hour+" mm"+minute);
		sfGeneralChat = new SimpleDateFormat("MM"+month+" dd"+day+" a hh"+hour+" mm"+minute);

		handler.sendEmptyMessage(SELECT_CHAT_INFORMATION);	// idUser 먼저 발급 받기 // -> 채팅방 정보 먼저.
		
	}


	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 사진
	public void onClickUploadImg(View v) {
		switch(v.getId()) {
		case R.id.image_send_btn:
			hideKeypad();
			AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
			View customLayout = View.inflate(mContext, R.layout.chat_room_custom_get_img_menu_layout, null);
			builder.setView(customLayout);		
			dialog = builder.create();
			dialog.show();
			break;
		case R.id.get_img_from_camera:
			dialog.dismiss();
			takePicture();
			break;
		case R.id.get_img_from_photo_album:
			dialog.dismiss();
			photoAlbum();
			break;
		}
	}
	//사진 촬영
	void takePicture() {
		//카메라 호출 intent 생성
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		startActivityForResult(intent, REQUEST_PICTURE);
	}
	//사진 불러오기
	void photoAlbum() {
		//photo Album 호출 intent 생성
		Intent intent = new Intent(Intent.ACTION_PICK);
		intent.setType(Images.Media.CONTENT_TYPE);
		intent.setData(Images.Media.EXTERNAL_CONTENT_URI);
		startActivityForResult(intent, REQUEST_PHOTO_ALBUM);
	}
	//촬영한 사진을 수정하기 위해서
	Bitmap loadPicture() {
		File file = new File(Environment.getExternalStorageDirectory(), SAMPLEIMG);
		BitmapFactory.Options option = new BitmapFactory.Options();
		option.inSampleSize = 4;
		return BitmapFactory.decodeFile(file.getAbsolutePath(), option);
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);

		// 실패시에는 그냥 반환
		if(resultCode != RESULT_OK)
			return;
		if(requestCode == REQUEST_PICTURE) {
			// intent 의 여분 데이터로 저장된 비트맵 이미지를 얻는다.
			mySelectedImage = (Bitmap)data.getExtras().get("data");
			//	  			Log.d(TAG,"REQUEST_PICTURE S/ "+mySelectedImage.getHeight());

			// go upload
			if(pushChatUser.getPushChatChatIdChat()==null || pushChatUser.getPushChatChatIdChat().length()<1){		// 모토로이를 위한 처리.
				if(readServerDataFromPreference()){
					pushChatUser.setIdUser(idUserFromServer);
					pushChatUser.setPushChatChatIdChat(chatChatIdChatFromServer);
					pushChatUser.setPushChatChatOwner(chatChatOwnerFromServer);
					handler.sendEmptyMessage(REGISTER_MESSAGE_WITH_IMAGE);
				}else{
					showResultDialog(getString(R.string.device_not_support_camera_upload));
					//					버그 신고 . 
				}
			}else{
				handler.sendEmptyMessage(REGISTER_MESSAGE_WITH_IMAGE);
			}
		}
		if(requestCode == REQUEST_PHOTO_ALBUM) {
			// uri 에서 이미지 가져오기
			Uri curImgURI = data.getData();
			try {
				mySelectedImage = Images.Media.getBitmap(getContentResolver(), curImgURI );
				Log.d(TAG,"REQUEST_PHOTO_ALBUM S");
				// go upload
				handler.sendEmptyMessage(REGISTER_MESSAGE_WITH_IMAGE);
			} catch (Exception e) { e.printStackTrace(); }
		}
	}



	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 비동기 작업

	/**
	 * 러너블. 채팅방 사용자 고유 키값 받기
	 */
	class RunnableSelectUserInformation implements Runnable {
		public void run(){
			new backgroundThreadSelectUserInformation().execute();	
		}
	}
	/**
	 * backgroundThreadSelectUserInformation
	 * 비동기 . 채팅방 사용자 고유 키값 받기
	 * @author blue
	 *
	 */
	public class backgroundThreadSelectUserInformation extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadSelectUserInformation");
			//showPb();

			newSearch = true;	// 처음 와서 조회하든, 채팅방 이동후 조회하든 무조건 실행되니까 데이터에 상관없이 이곳은 최초 조회라고 할 수 있음.

			// 파라미터 세팅
			PushChatUser pushChatUserParam = new PushChatUser();		// dd
			pushChatUserParam.setMemberId(userId);
			pushChatUserParam.setPushChatChatIdChat(recievedIdChat);
			pushChatUserParam.setPushChatChatOwner(recievedOwner);

			//			pushChatMember.setMemberId(userId);	// @@@ 
			//				chatRoom.setPushChatChatIdChat(recievedIdChat);
			//				chatRoom.setPushChatChatOwner(recievedOwner);
			// 메소드 호출
			//				resultStr = pushChatRest.RestSelectUserInformation(chatMember, chatRoom);
			resultStr = pushChatRest.RestSelectUserInformation(pushChatUserParam);
			if(resultStr.equals("F")){

			}else{
				try {
					JSONObject jsonObject = new JSONObject(resultStr);	
					pushChatUser = new PushChatUser();
					pushChatUser.setIdUser(jsonObject.getString("idUser"));
					pushChatUser.setMemberId(jsonObject.getString("memberId"));
					pushChatUser.setPushChatChatIdChat(jsonObject.getString("pushChatChatIdChat"));
					pushChatUser.setPushChatChatOwner(jsonObject.getString("pushChatChatOwner"));
					/*
					 * "idUser":"140",	"memberId":"test05",
					 * "pushChatChatIdChat":"89","pushChatChatOwner":"test01",
					 * "totalCount":null,"result":null,"deviceType":"AS","registrationId":"APA91bHAE8sJhvJKGG_vV60eY4I5qVwfO4GJAo4gME5oZ_9eKa_L9m7p3ppfso1H7ANbByRjJfkxUauYl9X2QVX3tFuhamdn0HunJLO7FN86rCeXC_ymxqc1Ia_g5Ay8gK-293LQRGf8YFZ0ovYtswtjivpxt3e_31pOKO_q6JCrLPfEGgiUSco"}
					 */
				} catch (Exception e) {
					// err
				}
				//				pushChatUser = pushChatRest.getPushChatUser();
				idUserFromServer = pushChatUser.getIdUser();
				chatChatIdChatFromServer = pushChatUser.getPushChatChatIdChat();
				chatChatOwnerFromServer = pushChatUser.getPushChatChatOwner();
				saveServerDataToPreference();

				PushChatRecognition pushChatRecognitionParam = new PushChatRecognition();
				pushChatRecognitionParam.setMemberId(userId);
				pushChatRecognitionParam.setPushChatChatIdChat(recievedIdChat);
				pushChatRecognitionParam.setPushChatChatOwner(recievedOwner);
				// 인지 테이블에 등록 여부 확인하여 등록하기 
				resultStr = pushChatRest.RestSelectDuplicationRecognition(pushChatRecognitionParam);
				//					RestSelectDuplicationRecognition(PushChatRecognition pushChatRecognitionParam
				if(resultStr.equals("F")){		// 실패한 경우

				}else{				// 등록되지 않은 경우. 새로 등록.	 if(resultStr.equals("F")
					try {
						JSONObject jsonObject = new JSONObject(resultStr);		// totalCount
						//						callResult = jsonObject.getString("totalCount");
						if(jsonObject.getString("totalCount").equals("0")){
							pushChatRecognitionParam.setMemberId(userId);
							pushChatRecognitionParam.setPushChatChatIdChat(recievedIdChat);
							pushChatRecognitionParam.setPushChatChatOwner(recievedOwner);
							pushChatRecognitionParam.setReadYn("Y");
							resultStr = pushChatRest.RestRegisterRecognition(pushChatRecognitionParam);
						}
					}catch(Exception e){
						//						callResult = "F";
					}
				}

				//				try {
				//				jsonObject = new JSONObject(tempstr);		// totalCount
				//				try{
				//					callResult = jsonObject.getString("totalCount");
				//				}catch(Exception e){
				//					callResult = "F";
				//				}
				//			} catch (JSONException e) {
				//				callResult = "F";
				//			}




				//				if(resultStr.equals("0")){			// 등록되지 않은 경우. 새로 등록.
				//					pushChatRecognitionParam.setMemberId(userId);
				//					pushChatRecognitionParam.setPushChatChatIdChat(recievedIdChat);
				//					pushChatRecognitionParam.setPushChatChatOwner(recievedOwner);
				//					pushChatRecognitionParam.setReadYn("Y");
				//					resultStr = pushChatRest.RestRegisterRecognition(pushChatRecognitionParam);
				//				}else if(resultStr.equals("F")){	// 실패한 경우
				//				}


				//					else{	// 1 이외의 값. 이미 등록된 경우. 패스
				//					}
				handler.sendEmptyMessage(SELECT_MESSAGE_LIST);	// 채팅방 메시지 목록 불러오기
			}
			
			return null; 
		}
	}
	/**
	 * 러너블. 메시지 리스트 가져오기(+메시지 읽음 여부 업데이트)
	 */
	class RunnableSelectMessageList implements Runnable {
		public void run(){
			new backgroundThreadSelectMessageList().execute();	
		}
	}
	/**
	 * backgroundThreadSelectMessageList
	 * 비동기 . 메시지 리스트 가져오기
	 * @author blue
	 *
	 */
	public class backgroundThreadSelectMessageList extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
			hidePb();
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadSelectMessageList");
			//showPb();

			// 메시지 목록 읽음 여부 업데이트하고
			PushChatRecognition pushChatRecognitionParam = new PushChatRecognition();
			Log.d(TAG,"userId:"+userId+"//recievedIdChat:"+recievedIdChat+"//recievedOwner:"+recievedOwner);
			pushChatRecognitionParam.setMemberId(userId);
			pushChatRecognitionParam.setReadYn("Y");
			pushChatRecognitionParam.setPushChatChatIdChat(recievedIdChat);
			pushChatRecognitionParam.setPushChatChatOwner(recievedOwner);
			resultStr = pushChatRest.RestUpdateReadYn(pushChatRecognitionParam);
			//				Log.d(TAG,"resultStr"+resultStr);
			// 목록 가져와서 뿌림
			if(resultStr.equals("F")){
				// err
			}else{

				try {
					JSONObject jsonObject = new JSONObject(resultStr);		// result		SUCCESS
					//					try{
					//						callResult = jsonObject.getString("result");
					if(jsonObject.getString("result").equals("SUCCESS")){
						PushChatMessage pushChatMessageParam = new PushChatMessage();
						pushChatMessageParam.setPushChatChatIdChat(recievedIdChat);
						resultStr = pushChatRest.RestSelectMessageList(pushChatMessageParam);	
						if(resultStr.equals("F")){
							showInfo();
						}else{
							proccessTheChatData(resultStr);		// 데이터 가져와서 처리
						}
					}
					//					}catch(Exception e){
					//						callResult = "F";
					//					}
				} catch (Exception e) {
					//					callResult = "F";
				}

				//				PushChatMessage pushChatMessageParam = new PushChatMessage();
				//				pushChatMessageParam.setPushChatChatIdChat(recievedIdChat);
				//				resultStr = pushChatRest.RestSelectMessageList(pushChatMessageParam);	
				//				if(resultStr.equals("S")){
				//					proccessTheChatData();		// 데이터 가져와서 처리
				//				}else{
				//					showInfo();
				//				}
			}
			//hidePb();
			return null; 
		}
	}


	/**
	 * 러너블. 메시지 작성.
	 */
	class RunnableRegisterMessage implements Runnable {
		public void run(){
			new backgroundThreadRegisterMessage().execute();	
		}
	}
	/**
	 * backgroundThreadRegisterMessage
	 * 비동기 . 메시지 작성.
	 * @author blue
	 *
	 */
	public class backgroundThreadRegisterMessage extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadRegisterMessage");
			showPb();
			// 파리미터 세팅
			Log.d(TAG,"userInputText:"+userInputText);
			Log.d(TAG,"pushChatUser.getPushChatChatIdChat():"+pushChatUser.getPushChatChatIdChat());
			Log.d(TAG,"pushChatUser.getPushChatChatOwner():"+pushChatUser.getPushChatChatOwner());
			Log.d(TAG,"pushChatUser.getMemberId():"+pushChatUser.getMemberId());
			Log.d(TAG,"userId:"+userId);
			//				Log.d(TAG,"userInputText:"+userInputText);
			PushChatMessage pushChatMessageParam = new PushChatMessage();
			pushChatMessageParam.setContent(userInputText);								// 내용
			pushChatMessageParam.setFileUrl("");
			pushChatMessageParam.setThumbnailUrl("");
			pushChatMessageParam.setIp("");					

			pushChatMessageParam.setPushChatChatIdChat(pushChatUser.getPushChatChatIdChat());		// 채팅방 고유번호
			pushChatMessageParam.setPushChatChatOwner(pushChatUser.getPushChatChatOwner());			// 방장 아이디
			pushChatMessageParam.setPushChatUserIdUser(pushChatUser.getIdUser());					// 채팅방 참여자 테이블에서의 아이디
			pushChatMessageParam.setPushChatUserMemberId(userId);									// 사용자 아이디

			pushChatMessageParam.setPushChatUserPushChatChatIdChat(pushChatUser.getPushChatChatIdChat());			
			pushChatMessageParam.setPushChatUserPushChatChatOwner(pushChatUser.getPushChatChatOwner());

			// 호출
			resultStr = pushChatRest.RestRegisterMessage(pushChatMessageParam);
			// 결과 처리
			if(resultStr.equals("F")){
				// 전송 실패
				showResultDialog(getString(R.string.message_send_fail));			 
				loading = false;
			}else{	
				try {
					JSONObject jsonObject = new JSONObject(resultStr);		// result
					if(jsonObject.getString("result").equals("SUCCESS")){
						// 성공 -> 채팅창 초기화.
						initTextField();
					}else{
						showResultDialog(getString(R.string.message_send_fail));			 
						loading = false;
					}
					//						callResult = jsonObject.getString("result");
				} catch (Exception e) {
					//					callResult = "F";
					showResultDialog(getString(R.string.message_send_fail));			 
					loading = false;
				}
			}
			hidePb();
			return null; 
		}
	}
	/**
	 * 러너블. 사진첨부 메시지 작성.		
	 */
	class RunnableRegisterMessageWithImage implements Runnable {
		public void run(){
			new backgroundThreadRegisterMessageWithImage().execute();	
		}
	}
	/**
	 * backgroundThreadRegisterMessageWithImage
	 * 비동기 . 사진 첨부 메시지 작성.
	 * @author blue
	 *
	 */
	public class backgroundThreadRegisterMessageWithImage extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) { 
			hidePb();
		} 
		@Override protected void onPreExecute() {  
			showPb();
		} 
		@Override protected Void doInBackground(Void... params) {  
			//				Log.d(TAG,"backgroundThreadRegisterMessageWithImage");
			// 파리미터 세팅
			PushChatMessage pushChatMessageParam = new PushChatMessage();
			//				ImageFile imageFileParam = new ImageFile();
			pushChatMessageParam.setContent(getString(R.string.picture));								// 내용
			pushChatMessageParam.setFileUrl("");
			pushChatMessageParam.setThumbnailUrl("");
			pushChatMessageParam.setIp("");					
			Log.d(TAG,"pushChatUser.getPushChatChatIdChat():"+pushChatUser.getPushChatChatIdChat());
			pushChatMessageParam.setPushChatChatIdChat(pushChatUser.getPushChatChatIdChat());		// 채팅방 고유번호
			pushChatMessageParam.setPushChatChatOwner(pushChatUser.getPushChatChatOwner());			// 방장 아이디
			pushChatMessageParam.setPushChatUserIdUser(pushChatUser.getIdUser());					// 채팅방 참여자 테이블에서의 아이디
			pushChatMessageParam.setPushChatUserMemberId(userId);									// 사용자 아이디

			pushChatMessageParam.setPushChatUserPushChatChatIdChat(pushChatUser.getPushChatChatIdChat());			
			pushChatMessageParam.setPushChatUserPushChatChatOwner(pushChatUser.getPushChatChatOwner());

			// 이미지 리사이즈
			Log.d(TAG,"img size:"+mySelectedImage.getWidth()+"x"+mySelectedImage.getHeight());
			mySelectedImage = commonUtil.resizeBitmapImage(mySelectedImage, MAX_WIDTH, MAX_HEIGHT);	 		// resize
			Log.d(TAG,"img size2:"+mySelectedImage.getWidth()+"x"+mySelectedImage.getHeight());
			pushChatMessageParam.setUploadFileImg(mySelectedImage);

			// 호출
			resultStr = pushChatRest.RestRegisterMessageWithImage(pushChatMessageParam, returnThis());
			//				Log.d(TAG,"RestRegisterMessageWithImage resultStr:"+resultStr);
			// 결과 처리
			if(resultStr.equals("F")){
				// 전송 실패
				showResultDialog(getString(R.string.message_send_fail));			 
				loading = false;
			}else{			
				try {
					JSONObject jsonObject = new JSONObject(resultStr);
					//					callResult = jsonObject.getString("result").toString(); 
					if(jsonObject.getString("result").toString().equals("SUCCESS")){
						// 성공 -> 채팅창 초기화.
						initTextField();
					}else{
						// 전송 실패
						showResultDialog(getString(R.string.message_send_fail));			 
						loading = false;
					}
				} catch (Exception e) {
					// 전송 실패
					showResultDialog(getString(R.string.message_send_fail));			 
					loading = false;
					e.printStackTrace();
				}
			}
			//			if(resultStr.equals("SUCCESS")){
			//				// 성공 -> 채팅창 초기화.
			//				initTextField();
			//			}else{	
			//				// 전송 실패
			//				showResultDialog(getString(R.string.message_send_fail));			 
			//				loading = false;
			//			}
			mySelectedImage = null;

			return null; 
		}
	}
	/**
	 * 러너블.  채팅방 정보얻기
	 */
	class RestSelectChatInformation implements Runnable {
		public void run(){
			new backgroundRunnableSelectChatInformation().execute();
		}
	}
	/**
	 * backgroundRunnableSelectChatInformation
	 *  비동기로 채팅방 정보얻기
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundRunnableSelectChatInformation extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
			
		}
		@Override protected void onPreExecute() { 
			showPb();
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundRunnableSelectChatInformation");
			
			PushChatChat pushChatChatParam = new PushChatChat();
			pushChatChatParam.setOwner(recievedOwner);
			
			// 호출
			String callResult = pushChatRest.RestSelectChatInformation(pushChatChatParam);		
			//			// 결과 처리		 
			if(!(callResult.equals("F"))){ 
				Log.d(TAG,"callResult:"+callResult);
				
				/*
				 *  callResult:
				 *  {"idChat":"99",
				 *  "owner":"test01",
				 *  "ip":"","activateYn":"Y",
				 *  "modifyDate":"2013-12-17 17:49:57",
				 *  "registerDate":"2013-12-17 17:49:57",
				 *  "totalCount":null,"result":null,
				 *  "nickName":null,"messageCount":null,
				 *  "content":null,"fileUrl":null,
				 *  "idUser":null,"memberId":null,
				 *  "pushChatChatIdChat":null,"pushChatChatOwner":null,"recognitionCount":null,"readYn":null,"otherUserNickName":null,"otherUserId":null,"thumbnailUrl":null}
				 */
				try {
					JSONObject jsonObject = new JSONObject(callResult);
					pushChatChat = new PushChatChat();
					pushChatChat.setIdChat(jsonObject.getString("idChat").toString());
				} catch (Exception e) {
					callResult = "F";
					e.printStackTrace();
//					showMSG();
				}
				handler.sendEmptyMessage(SELECT_USER_INFORMATION);	// idUser 발급 받기
			}else{
				showMSG();
				hidePb();
			}
			
			return null ;
		}
	}
	/**
	 * 러너블.  사용자 차단
	 */
	class RunnableRegisterBlock implements Runnable {
		public void run(){
			new backgroundRunnableRegisterBlock().execute();
		}
	}
	/**
	 * backgroundRunnableRegisterBlock
	 *  비동기로 사용자 차단	
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundRunnableRegisterBlock extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
			hidePb();
		}
		@Override protected void onPreExecute() { 
			showPb();
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundRunnableRegisterBlock");
			
			PushChatBlock pushChatBlockParam = new PushChatBlock();
			pushChatBlockParam.setMemberId(recievedOtherUserId);					// 상대방 아이디		
			pushChatBlockParam.setReporter(userId);						// 신고자 (내) 아이디
			pushChatBlockParam.setReason("");
			pushChatBlockParam.setIdChat(pushChatChat.getIdChat());								// 채팅방 고유번호
			pushChatBlockParam.setIdPushChatDiary("");		
			Log.d(TAG,"userId:"+userId);
			Log.d(TAG,"idChat:"+pushChatChat.getIdChat());
//			Log.d(TAG,"memberId:"+pushChatChat.getOtherUserId());
			// 호출
			String callResult = pushChatRest.RestRegisterBlock(pushChatBlockParam);		
			//			// 결과 처리		 
			if(callResult.equals("SUCCESS")){ // 차단 성공 	 
				showAlert(getString(R.string.block_success));
//				showAlert(getString(R.string.like_success));
//				handler.sendEmptyMessage(SELECT_DIARY_INFORMATION);	// 화면 갱신
			}else if(callResult.equals("D")){
				showAlert(getString(R.string.already_block));
			}else{
				showMSG();
			}
			return null ;
		}
	}




	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 리스팅	

	/**
	 * setListing
	 *  리스트 보여준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void setListing(){
		chatRoomMessageListAdapter = new ChatRoomMessageListAdapter(this, entriesFn);
		listView.setAdapter(chatRoomMessageListAdapter);

		//			// 클릭시 상세보기 페이지로
		//			gridView.setOnItemClickListener(new OnItemClickListener() {
		//				public void onItemClick(AdapterView<?> parent, View v,
		//						int position, long id) {
		//					Intent intent = new Intent(MemberStoreListPageActivity.this, MemberStoreInfoPage.class);
		//					Log.i(TAG, "checkMileageMerchantsMerchantID::"+entriesFn.get(position).getMerchantId());
		//					Log.i(TAG, "myMileage::"+entriesFn.get(position).getMileage());
		//					intent.putExtra("checkMileageMerchantsMerchantID", entriesFn.get(position).getMerchantId());		// 가맹점 아이디
		//					intent.putExtra("idCheckMileageMileages", entriesFn.get(position).getIdCheckMileageMileages());		// 고유 식별 번호. (상세보기 조회용도)
		//					intent.putExtra("myMileage", entriesFn.get(position).getMileage());									// 내 마일리지
		//					startActivity(intent);
		//				}
		//			});


		//			listView.setOnScrollListener(listScrollListener);		// 리스너 등록. 스크롤시 하단에 도착하면 추가 데이터 조회하도록.
	}	


	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 유틸	

	/**
	 *  화면에 있는 채팅 리스트를 갱신한다. 
	 *   푸시를 통해 지시를 받았을때 외부에서 호출하기 위해 만든 메소드이다.
	 */
	public void callRefresh(){
		if(isRunning<1){
			isRunning = 1;
			handler.sendEmptyMessage(SELECT_MESSAGE_LIST);
		}else{
			Log.w(TAG, "already running..");
		}
	}

	/**
	 *  다른 방으로 이동한다. // 유저아이디는 일치한다는 가정하에 온거니까 다시 세팅하지 않음.
	 *   푸시를 통해 지시를 받았을때 외부에서 호출하기 위해 만든 메소드이다.
	 */
	public void updateDataAndCallRefresh(String receivedChatRoomId, String receivedChatRoomOwner){
		if(isRunning<1){
			isRunning = 1;
			//				recievedIdChat 만 가지고 채팅 리스트 업데이트를 한다고 함. receivedChatRoomOwner 는 방장 아이디인가 봄.

			// 값 전달 받음
			recievedOwner = receivedChatRoomOwner;
			recievedIdChat = receivedChatRoomId;

			// 저장용 값 변경해주기
			SharedPreferences.Editor saveChatRoomStatusPref = sharedPrefCustom.edit();
			saveChatRoomStatusPref.putBoolean("chatRoomUsingYn", true);			   		// 채팅방 사용중. (푸시를 통한 리프레시 기능을 위해 필요)	
			saveChatRoomStatusPref.putString("currentChatRoomId", recievedIdChat);		//  위의 두 값이 바뀐후 리프레시한다면 채팅방이 바뀌는 효과.(타이틀도 바꿔야)
			saveChatRoomStatusPref.putString("currentChatRoomOwner", recievedOwner);	//  그에 따른 변수도 함께 바껴야 (최초 조회 여부 관련) 	
			saveChatRoomStatusPref.commit();
			//				CommonConstant.chatRoomUsingYn = true; // 채팅방 사용중. (푸시를 통한 리프레시 기능을 위해 필요)
			//				CommonConstant.currentChatRoomId = recievedIdChat; //  위의 두 값이 바뀐후 리프레시한다면 채팅방이 바뀌는 효과.(타이틀도 바꿔야) 
			//				CommonConstant.currentChatRoomOwner = recievedOwner;   //  그에 따른 변수도 함께 바껴야 (최초 조회 여부 관련)

			// 채팅방 제목 변경
			titleChange();

			// 채팅방에서의 사용자 아이디 받고, 메시지 목록 갱신하고 등등 처리함.
			handler.sendEmptyMessage(SELECT_USER_INFORMATION);
		}else{
			Log.w(TAG, "already running..");
		}
	}




	///////////////////////////////////////////////////////	


	/*
	 * 1. 데이터 최초 조회시. 리프래시랑 충돌 가능성. 있으니까. 
	 *      
	 * 
	 *  저장된 총개수.
	 *  총개수 저장 / 시작 저장 / 끝 저장 / 최초 조회여부 저장 / 
	 * 
	 * 		일단 총 개수를 저장
	 *      데이터 개수가 20개 미만. 그냥 보여준다.
	 *      데이터 개수가 20개 이상. 마지막 20개를 보여주고, 인덱스를 저장한다.
	 * 2. 데이터 스크롤시.
	 *      남은 데이터가 20개 미만. 인덱스로부터 0번째까지 추가해서 보여준다.
	 *      남은 데이터가 20개 이상. 인덱스로부터 20개를 보여주고, 인덱스를 저장한다.
	 *      
	 * 3. 푸시 알림 받아서 리프래시 해야할때.		총개수가 바뀌면 시작저장 끝저장도 함께 바뀌도록.하면 될 듯. 가르키는 값이 동일해지도록.
	 *      저장한 총개수와 비교.
	 *      총개수에서 추가된 만큼만....
	 *       이미지까지 조회해서 최종 데이터에 더하기.. 0번째에 더하면 가장 아래에 붙는다.
	 *      그리고 바로 보여준다. 
	 *      그리고 총개수를 업데이트해서 저장.
	 *      
	 */

	/**
	 * 	채팅 데이터를 처리한다. 
	 *    - string 으로 되어 있는 데이터를 변환하여 리스트에 담아 화면에 출력까지처리한다.
	 */
	public void proccessTheChatData(String resultStr){
		Date tempDate = new Date();


		// 화면에 통째로 보여줄지, 추가된 내용을 추가해서 업데이트할지는 결과 리스트의 변화에 따라 결정되므로 결과만 받아오지 않고, 중간 결과를 받아와서 이곳에서 처리함.
		//		String tempstr = pushChatRest.getTempstr();
		JSONArray jsonArray2 = null;		
		try {
			jsonArray2 = new JSONArray(resultStr);
		} catch (JSONException e1) {
			e1.printStackTrace();
		}
		int max = jsonArray2.length();

		if(newSearch){	// 최초 조회인 경우
			Log.d(TAG,"newSearch");
			//  최초 조회일때 		// 이미지를 제외하고 저장한다. 
			try {
				entries1 = new ArrayList<PushChatMessage>(max);
				if(max>0){
					for ( int i = 0; i < max; i++ ){
						JSONObject jsonObj = jsonArray2.getJSONObject(i);
						try{
							tmp_pushChatUserMemberId = jsonObj.getString("pushChatUserMemberId");
							//							if(tmp_pushChatUserMemberId.equals(pushChatMember.getMemberId())){	// 나와 같다면
							if(tmp_pushChatUserMemberId.equals(userId)){	// 나와 같다면
								tmp_myMessageYn = "Y";
							}else{
								tmp_myMessageYn = "N";
							}
						}catch(Exception e){
							tmp_pushChatUserMemberId = "";
						}
						try{
							tmp_content = jsonObj.getString("content");
						}catch(Exception e){
							tmp_content = "";
						}
						try{
							tmp_registerDate = jsonObj.getString("registerDate");
							// 형변환 작업
							tempDate = commonUtil.sf.parse(tmp_registerDate);
							commonUtil.context = this;
							tmp_registerDate = sfGeneralChat.format(tempDate);
						}catch(Exception e){
							tmp_registerDate = "";
						}
						try{
							tmp_nickName = jsonObj.getString("nickName");
						}catch(Exception e){
							tmp_nickName = "";
						}
						try{
							tmp_fileUrl = jsonObj.getString("fileUrl");
							tmp_uploadFileImg = null;
						}catch(Exception e){
							e.printStackTrace();
							tmp_fileUrl = "";		
						}
						try{
							tmp_thumbnailUrl = jsonObj.getString("thumbnailUrl");
							tmp_uploadFileThumbnailImg = null;
						}catch(Exception e){
							tmp_thumbnailUrl = "";
							tmp_uploadFileThumbnailImg = null;
						}
						try{
							tmp_profileImageUrl = jsonObj.getString("profileImageUrl");
							tmp_profileImg = null;
						}catch(Exception e){
							tmp_profileImageUrl = "";
						}
						try{
							tmp_profileThumbnailUrl = jsonObj.getString("profileThumbnailUrl");
							tmp_profileThumbnailImg = null;
						}catch(Exception e){
							tmp_profileThumbnailUrl = "";
						}
						entries1.add(new PushChatMessage(
								tmp_pushChatUserMemberId,
								tmp_content,
								tmp_registerDate,
								tmp_nickName,
								tmp_profileImageUrl,
								tmp_profileThumbnailUrl,
								tmp_profileImg,
								tmp_profileThumbnailImg,
								tmp_myMessageYn,
								tmp_thumbnailUrl,
								tmp_uploadFileThumbnailImg,
								tmp_fileUrl,
								tmp_uploadFileImg
						));
					}
				}
			}catch (JSONException e) {
				e.printStackTrace();
			}

			indexDataTotal = max;	// 전체 개수를 업데이트 한다.	//entries1.size()
			// 가장 끝에서 시작할거니까 마지막 값을 저장해둔다 (전체 개수). 인덱스로 사용시 -1할것.
			indexDataFirst = indexDataTotal;
			indexDataLast = indexDataTotal;

			proccessTheChatImageData();
		}else{			// 최초 조회가 아닐때
			Log.d(TAG,"not newSearch");
			if(indexDataTotal==max){
				// 변화 없는 경우. 
			}else{
				// 변화된 것만 업데이트  . 추가데이터는 이미지를 포함함. 이후 바로 보여준다.
				try{
					for ( int i = indexDataTotal; i < max; i++ ){	// 사이즈이지만 추가 데이터를 위해 인덱스로 사용. max 는 사이즈
						JSONObject jsonObj = jsonArray2.getJSONObject(i);
						try{
							tmp_pushChatUserMemberId = jsonObj.getString("pushChatUserMemberId");
							if(tmp_pushChatUserMemberId.equals(userId)){	// 나와 같다면
								//								if(tmp_pushChatUserMemberId.equals(pushChatMember.getMemberId())){	// 나와 같다면
								tmp_myMessageYn = "Y";
							}else{
								tmp_myMessageYn = "N";
							}
						}catch(Exception e){
							tmp_pushChatUserMemberId = "";
						}
						try{
							tmp_content = jsonObj.getString("content");
						}catch(Exception e){
							tmp_content = "";
						}
						try{
							tmp_registerDate = jsonObj.getString("registerDate");
							// 형변환 작업
							tempDate = commonUtil.sf.parse(tmp_registerDate);
							commonUtil.context = this;
							tmp_registerDate = sfGeneralChat.format(tempDate);
						}catch(Exception e){
							tmp_registerDate = "";
						}
						try{
							tmp_nickName = jsonObj.getString("nickName");
						}catch(Exception e){
							tmp_nickName = "";
						}
						try{
							tmp_fileUrl = jsonObj.getString("fileUrl");
							tmp_uploadFileImg = null;	// 썸네일만 가져오도록 수정
							//								if(tmp_fileUrl==null||tmp_fileUrl.length()<1||tmp_fileUrl.equals("null")){
							//									tmp_uploadFileImg = null;
							//								}else{
							//									tmp_uploadFileImg = LoadImage(tmp_fileUrl);
							//								}
						}catch(Exception e){
							tmp_fileUrl = "";
							tmp_uploadFileImg = null;
						}
						try{
							tmp_thumbnailUrl = jsonObj.getString("thumbnailUrl");
							if(tmp_thumbnailUrl==null||tmp_thumbnailUrl.length()<1||tmp_thumbnailUrl.equals("null")){
								tmp_uploadFileThumbnailImg = null;
							}else{
								tmp_uploadFileThumbnailImg = LoadImage(tmp_thumbnailUrl, false);
							}
						}catch(Exception e){
							tmp_thumbnailUrl = "";
							tmp_uploadFileThumbnailImg = null;
						}
						try{
							tmp_profileImageUrl = jsonObj.getString("profileImageUrl");
							tmp_profileImg = null;
						}catch(Exception e){
							tmp_profileImageUrl = "";

						}
						try{
							tmp_profileThumbnailUrl = jsonObj.getString("profileThumbnailUrl");
							if(tmp_profileThumbnailUrl==null||tmp_profileThumbnailUrl.length()<1||tmp_profileThumbnailUrl.equals("null")){
								tmp_profileThumbnailImg = null;
							}else{
								if(!(tmp_pushChatUserMemberId.equals(userId))){	// 상대방의 것만.
									//								if(!(tmp_pushChatUserMemberId.equals(pushChatMember.getMemberId()))){	// 상대방의 것만.
									if(tmp_prevImageUrl.equals(tmp_profileThumbnailUrl)){	// 기존 것과 같으면 그대로 사용
										tmp_profileThumbnailImg = tmp_prevImage;
									}else{
										tmp_prevImageUrl = tmp_profileThumbnailUrl;		// 기존것과 다르다면 새로 조회
										tmp_prevImage = LoadImage(tmp_prevImageUrl, true);
										tmp_profileThumbnailImg = tmp_prevImage;
									}
								}
							}
						}catch(Exception e){
							tmp_profileThumbnailImg = null;
							tmp_profileThumbnailUrl = "";
						}
						// 최초 조회 데이터는 마지막에 붙인다.
						entries1.add(new PushChatMessage(
								tmp_pushChatUserMemberId,
								tmp_content,
								tmp_registerDate,
								tmp_nickName,
								tmp_profileImageUrl,
								tmp_profileThumbnailUrl,
								tmp_profileImg,
								tmp_profileThumbnailImg,
								tmp_myMessageYn,
								tmp_thumbnailUrl,
								tmp_uploadFileThumbnailImg,
								tmp_fileUrl,
								tmp_uploadFileImg
						));
						// 최종 결과 리스트의 가장 첫번째에 넣는다.(최종 결과 리스트는 역순 데이터) 첫번째 데이터가 가장 하단에 붙게 된다.?? 똑같은데
						//							entriesFn.add(0,new PushChatMessage(
						entriesFn.add(new PushChatMessage(
								tmp_pushChatUserMemberId,
								tmp_content,
								tmp_registerDate,
								tmp_nickName,
								tmp_profileImageUrl,
								tmp_profileThumbnailUrl,
								tmp_profileImg,
								tmp_profileThumbnailImg,
								tmp_myMessageYn,
								tmp_thumbnailUrl,
								tmp_uploadFileThumbnailImg,
								tmp_fileUrl,
								tmp_uploadFileImg
						));
					}						
					indexDataTotal = max;		// 총 개수를 업데이트한다.	// =  entries1.size()
					// 기존 인덱스들은 동일한 대상을 가르키므로 바꿔주지 않는다. (최초 조회 데이터의 마지막에 추가됐기 때문. 뒤쪽은 신경 안씀. 앞쪽만 추가조회하니까.)						
				}catch(Exception e){
					e.printStackTrace();
				}

				// 추가 데이터는 바로 보여준다.
				hidePb();
				showInfo();
			}
		}
		isRunning = 0;
	}



	/**
	 * 	채팅 이미지 데이터를 처리한다.. 최초 조회용. 
	 */
	public void proccessTheChatImageData(){
		for(int i=0; i<indexDataTotal; i++){
			PushChatMessage tempPushChatMessage = (PushChatMessage)entries1.get(i);
			// 이미지를 불러와서 저장시킨다.
			tempPushChatMessage = setImageToMessage(tempPushChatMessage);
			entriesFn.add(tempPushChatMessage);
		}
		//			// 최초 조회한 경우
		//			if(indexDataFirst == indexDataTotal){
		//				// 20개 이하이면 모두 사용하고, 20개 이상일때는 20개만 잘라서 사용
		//				if(indexDataTotal >= COUNT_OF_SHOW_CHAT_MESSAGE_AT_ONE_TIME){	// 전체 개수가 더 많음	
		//					// 데이터 개수 20개 이상인 경우. 가장 마지막 20개만 사용
		//					Log.d(TAG,"total:"+indexDataTotal+"//"+(indexDataTotal-1)+"~"+(indexDataTotal-COUNT_OF_SHOW_CHAT_MESSAGE_AT_ONE_TIME));
		//					for(int i=indexDataTotal-1; i>(indexDataTotal-COUNT_OF_SHOW_CHAT_MESSAGE_AT_ONE_TIME); i--){	// 끝에서 부터. 20개만
		//						Log.d(TAG,"i:"+i);
		//						PushChatMessage tempPushChatMessage = (PushChatMessage)entries1.get(i);
		//						// 이미지를 불러와서 저장시킨다.
		//						tempPushChatMessage = setImageToMessage(tempPushChatMessage);
		//						entriesFn.add(tempPushChatMessage);
		//					}
		//					indexDataLast = indexDataTotal -1;		// 가장 끝에서부터 (=인덱스)
		//					indexDataFirst = indexDataTotal - COUNT_OF_SHOW_CHAT_MESSAGE_AT_ONE_TIME;	// n개 전까지 조회함 (=인덱스)
		//				}else{				
		//					// 데이터 개수 20개 미만인 경우. 최대 개수 모두 사용. 0까지 내려옴
		//					for(int i=indexDataTotal -1; i<0; i--){
		//						Log.d(TAG,"i:"+i);
		//						PushChatMessage tempPushChatMessage = (PushChatMessage)entries1.get(i);
		//						// 이미지를 불러와서 저장시킨다.
		//						tempPushChatMessage = setImageToMessage(tempPushChatMessage);
		//						entriesFn.add(tempPushChatMessage);
		//					}
		//					indexDataLast = indexDataTotal -1;
		//					indexDataFirst = 0;
		//				}
		//				
		//				if(indexDataFirst==0){
		//					mIsFirst = true;		// 가장 처음까지 갔음
		//				}
		//				
		//			}else if(indexDataFirst!=0 && indexDataLast!= indexDataTotal-1){	//   이미 앞부분을 나눠서 뒷부분을 붙여야 하는 경우. 모두조회한경우아님. + (데이터를 잘라 붙이고 나면 indexDataLast 가 전체데이터의 마지막 데이터가 될수 없음)
		//				// 20개 추가가 불가능 (최대 개수에 도달)시 최대 개수까지 진행한다.
		//				if(indexDataFirst < COUNT_OF_SHOW_CHAT_MESSAGE_AT_ONE_TIME){	
		//					for(int i=indexDataLast; i<0; i--){
		//						Log.d(TAG,"i:"+i);
		//						PushChatMessage tempPushChatMessage = (PushChatMessage)entries1.get(i);
		//						// 이미지를 불러와서 저장시킨다.
		//						tempPushChatMessage = setImageToMessage(tempPushChatMessage);
		//						entriesFn.add(tempPushChatMessage);
		//					}
		//					indexDataFirst = 0;
		//					indexDataLast = 0;		// 따로 계산이 되지 않네. n 보다 작은 값임.
		//				}else{	
		//					// 20개 추가 가능하면 20개까지 추가해준다.  // 마지막 번호 + 20개보다 클때는 20개추가 가능
		//					for(int i=indexDataLast; i<indexDataLast-COUNT_OF_SHOW_CHAT_MESSAGE_AT_ONE_TIME; i--){
		//						Log.d(TAG,"i:"+i);
		//						PushChatMessage tempPushChatMessage = (PushChatMessage)entries1.get(i);
		//						// 이미지를 불러와서 저장시킨다.
		//						tempPushChatMessage = setImageToMessage(tempPushChatMessage);
		//						entriesFn.add(tempPushChatMessage);
		//					}
		//					indexDataLast = indexDataLast - COUNT_OF_SHOW_CHAT_MESSAGE_AT_ONE_TIME;
		//					indexDataFirst = indexDataFirst - COUNT_OF_SHOW_CHAT_MESSAGE_AT_ONE_TIME;
		//				}
		//				if(indexDataFirst==0){
		//					mIsFirst = true;		// 가장 처음까지 갔음
		//				}
		//			}else{
		//				// 최대 개수까지 다 됐음.
		//			}


		// 화면에 최초 모드로 입력해준다.		// 화면에 추가된 데이터를 업데이트해준다.
		showInfo();
		hidePb();	


		// 0번째에 add 하면 전체 뒤로 밀려날지도 모름. 그럼 처음에 넣는것도 가능해짐.


		////			pushChatMember = pushChatRest.getChatMember();		// idUser 값을 얻기 위함.
		////			idUser = pushChatMember.getMemberId();		
		//			
		//			// 화면에 통째로 보여줄지, 추가된 내용을 추가해서 업데이트할지는 결과 리스트의 변화에 따라 결정되므로 결과만 받아오지 않고, 중간 결과를 받아와서 이곳에서 처리함.
		//			String tempstr = pushChatRest.getTempstr();
		//			JSONArray jsonArray2 = null;		
		//			try {
		//				jsonArray2 = new JSONArray(tempstr);
		//			} catch (JSONException e1) {
		//				e1.printStackTrace();
		//			}
		//			int max = jsonArray2.length();
		//			if(savedEntriesFnSize!=0){		// 이전에 저장된 메시지 개수가 0개가 아닐때(최초 조회가 아닐때)
		//				isFirstGetList = false;
		//				if(savedEntriesFnSize==max){
		//					// 변화 없는 경우. 
		//				}else{
		//					// 변화된 것만 업데이트  
		//					try{
		//						for ( int i = savedEntriesFnSize; i < max; i++ ){
		//							JSONObject jsonObj = jsonArray2.getJSONObject(i);
		//							
		//							try{
		//								tmp_pushChatUserMemberId = jsonObj.getString("pushChatUserMemberId");
		//								if(tmp_pushChatUserMemberId.equals(pushChatMember.getMemberId())){	// 나와 같다면
		//									tmp_myMessageYn = "Y";
		//								}else{
		//									tmp_myMessageYn = "N";
		//								}
		//							}catch(Exception e){
		//								tmp_pushChatUserMemberId = "";
		//							}
		//							try{
		//								tmp_content = jsonObj.getString("content");
		//							}catch(Exception e){
		//								tmp_content = "";
		//							}
		//							try{
		//								tmp_registerDate = jsonObj.getString("registerDate");
		//							}catch(Exception e){
		//								tmp_registerDate = "";
		//							}
		//							try{
		//								tmp_nickName = jsonObj.getString("nickName");
		//							}catch(Exception e){
		//								tmp_nickName = "";
		//							}
		//							try{
		//								tmp_fileUrl = jsonObj.getString("fileUrl");
		//								if(tmp_fileUrl==null||tmp_fileUrl.length()<1||tmp_fileUrl.equals("null")){
		//									tmp_uploadFileImg = null;
		//								}else{
		////									Log.d(TAG,"fileUrl in continue::"+tmp_fileUrl);
		//									tmp_uploadFileImg = LoadImage(tmp_fileUrl);
		////									tmp_uploadFileImg = null;
		//								}
		//							}catch(Exception e){
		//								Log.d(TAG,"LoadImage(tmp_fileUrl) error in continue");
		//								tmp_fileUrl = "";
		//								tmp_uploadFileImg = null;
		//							}
		//							try{
		//								tmp_thumbnailUrl = jsonObj.getString("thumbnailUrl");
		//								if(tmp_thumbnailUrl==null||tmp_thumbnailUrl.length()<1||tmp_thumbnailUrl.equals("null")){
		//									tmp_uploadFileThumbnailImg = null;
		//								}else{
		////									Log.d(TAG,"thumbnailUrl::"+tmp_thumbnailUrl);
		//									tmp_uploadFileThumbnailImg = LoadImage(tmp_thumbnailUrl);
		////									tmp_uploadFileThumbnailImg = null;
		//								}
		//							}catch(Exception e){
		//								tmp_thumbnailUrl = "";
		//								tmp_uploadFileThumbnailImg = null;
		//							}
		//							try{
		//								tmp_profileImageUrl = jsonObj.getString("profileImageUrl");
		//								if(tmp_profileImageUrl==null||tmp_profileImageUrl.length()<1||tmp_profileImageUrl.equals("null")){
		//									tmp_profileImg = null;
		//								}else{
		////									Log.d(TAG,"tmp_profileImageUrl::"+tmp_profileImageUrl);
		////									tmp_profileImg = LoadImage(tmp_profileImageUrl);
		//									tmp_profileImg = null;
		//								}
		//							}catch(Exception e){
		//								tmp_profileImageUrl = "";
		//								tmp_profileImg = null;
		//							}
		//							try{
		//								tmp_profileThumbnailUrl = jsonObj.getString("profileThumbnailUrl");
		//								if(tmp_profileThumbnailUrl==null||tmp_profileThumbnailUrl.length()<1||tmp_profileThumbnailUrl.equals("null")){
		//									tmp_profileThumbnailImg = null;
		//								}else{
		//									if(!(tmp_pushChatUserMemberId.equals(pushChatMember.getMemberId()))){	// 상대방의 것만.
		//										if(tmp_prevImageUrl.equals(tmp_profileThumbnailUrl)){	// 기존 것과 같으면 그대로 사용
		//											tmp_profileThumbnailImg = tmp_prevImage;
		//										}else{
		////											Log.d(TAG,"tmp_profileThumbnailUrl::"+tmp_profileThumbnailUrl);
		//											tmp_prevImageUrl = tmp_profileThumbnailUrl;		// 기존것과 다르다면 새로 조회
		//											tmp_prevImage = LoadImage(tmp_prevImageUrl);
		//											tmp_profileThumbnailImg = tmp_prevImage;
		//										}
		//									}
		//								}
		//							}catch(Exception e){
		//								tmp_profileThumbnailUrl = "";
		//								tmp_profileThumbnailImg = null;
		//							}
		//							entriesFn.add(new PushChatMessage(
		//									tmp_pushChatUserMemberId,
		//									tmp_content,
		//									tmp_registerDate,
		//									tmp_nickName,
		//									tmp_profileImageUrl,
		//									tmp_profileThumbnailUrl,
		//									tmp_profileImg,
		//									tmp_profileThumbnailImg,
		//									tmp_myMessageYn,
		//									tmp_thumbnailUrl,
		//									tmp_uploadFileThumbnailImg,
		//									tmp_fileUrl,
		//									tmp_uploadFileImg
		//							));
		//						}
		//							
		//					}catch(Exception e){
		//						e.printStackTrace();
		//					}
		//					savedEntriesFnSize = entriesFn.size();	// 전체 개수를 업데이트 한다.
		//				}
		//			}else{	//  최초 조회일때 
		//				isFirstGetList = true;
		//				try {
		//					entries1 = new ArrayList<PushChatMessage>(max);
		//					if(max>0){
		//						for ( int i = 0; i < max; i++ ){
		//							JSONObject jsonObj = jsonArray2.getJSONObject(i);
		//							
		//							try{
		//								tmp_pushChatUserMemberId = jsonObj.getString("pushChatUserMemberId");
		//								if(tmp_pushChatUserMemberId.equals(pushChatMember.getMemberId())){	// 나와 같다면
		//									tmp_myMessageYn = "Y";
		//								}else{
		//									tmp_myMessageYn = "N";
		//								}
		//							}catch(Exception e){
		//								tmp_pushChatUserMemberId = "";
		//							}
		//							try{
		//								tmp_content = jsonObj.getString("content");
		//							}catch(Exception e){
		//								tmp_content = "";
		//							}
		//							try{
		//								tmp_registerDate = jsonObj.getString("registerDate");
		//							}catch(Exception e){
		//								tmp_registerDate = "";
		//							}
		//							try{
		//								tmp_nickName = jsonObj.getString("nickName");
		//							}catch(Exception e){
		//								tmp_nickName = "";
		//							}
		//							try{
		//								tmp_fileUrl = jsonObj.getString("fileUrl");
		//								if(tmp_fileUrl==null||tmp_fileUrl.length()<1||tmp_fileUrl.equals("null")){
		//									tmp_uploadFileImg = null;
		//								}else{
		////									Log.d(TAG,"fileUrl in first::"+tmp_fileUrl+"("+i+")");
		//									try{
		//										tmp_uploadFileImg = LoadImage(tmp_fileUrl);
		//									}catch(Exception e){
		//										e.printStackTrace();
		//									}
		//								}
		//							}catch(Exception e){
		//								e.printStackTrace();
		//								tmp_fileUrl = "";		
		//								tmp_uploadFileImg = null;
		//							}
		//							try{
		//								tmp_thumbnailUrl = jsonObj.getString("thumbnailUrl");
		//								if(tmp_thumbnailUrl==null||tmp_thumbnailUrl.length()<1||tmp_thumbnailUrl.equals("null")){
		//									tmp_uploadFileThumbnailImg = null;
		//								}else{
		////									Log.d(TAG,"thumbnailUrl::"+tmp_thumbnailUrl);
		//									tmp_uploadFileThumbnailImg = LoadImage(tmp_thumbnailUrl);
		////									tmp_uploadFileThumbnailImg = null;
		//								}
		//							}catch(Exception e){
		//								tmp_thumbnailUrl = "";
		//								tmp_uploadFileThumbnailImg = null;
		//							}
		//							try{
		//								tmp_profileImageUrl = jsonObj.getString("profileImageUrl");
		//								if(tmp_profileImageUrl==null||tmp_profileImageUrl.length()<1||tmp_profileImageUrl.equals("null")){
		//									tmp_profileImg = null;
		//								}else{
		////									Log.d(TAG,"tmp_profileImageUrl::"+tmp_profileImageUrl);
		////									tmp_profileImg = LoadImage(tmp_profileImageUrl);
		//									tmp_profileImg = null;
		//								}
		//							}catch(Exception e){
		//								tmp_profileImageUrl = "";
		//								tmp_profileImg = null;
		//							}
		//							try{
		//								tmp_profileThumbnailUrl = jsonObj.getString("profileThumbnailUrl");
		//								if(tmp_profileThumbnailUrl==null||tmp_profileThumbnailUrl.length()<1||tmp_profileThumbnailUrl.equals("null")){
		//									tmp_profileThumbnailImg = null;
		//								}else{
		//									if(!(tmp_pushChatUserMemberId.equals(pushChatMember.getMemberId()))){	// 상대방의 것만.
		//										if(tmp_prevImageUrl.equals(tmp_profileThumbnailUrl)){	// 기존 것과 같으면 그대로 사용
		//											tmp_profileThumbnailImg = tmp_prevImage;
		//										}else{
		////											Log.d(TAG,"tmp_profileThumbnailUrl::"+tmp_profileThumbnailUrl);
		//											tmp_prevImageUrl = tmp_profileThumbnailUrl;		// 기존것과 다르다면 새로 조회
		//											tmp_prevImage = LoadImage(tmp_prevImageUrl);
		//											tmp_profileThumbnailImg = tmp_prevImage;
		//										}
		//									}
		//								}
		//							}catch(Exception e){
		//								tmp_profileThumbnailUrl = "";
		//								tmp_profileThumbnailImg = null;
		//							}
		//							entries1.add(new PushChatMessage(
		//									tmp_pushChatUserMemberId,
		//									tmp_content,
		//									tmp_registerDate,
		//									tmp_nickName,
		//									tmp_profileImageUrl,
		//									tmp_profileThumbnailUrl,
		//									tmp_profileImg,
		//									tmp_profileThumbnailImg,
		//									tmp_myMessageYn,
		//									tmp_thumbnailUrl,
		//									tmp_uploadFileThumbnailImg,
		//									tmp_fileUrl,
		//									tmp_uploadFileImg
		//							));
		//						}
		//					}
		//				}catch (JSONException e) {
		//					e.printStackTrace();
		//				}
		//				entriesFn = entries1; 
		//			}
		//			isRunning = 0;		
		//			hidePb();
		//			showInfo();
	}


	/**
	 * 채팅 메시지에 이미지를 로드해서 저장해준다.
	 * @param tempPushChatMessage
	 * @return
	 */
	public PushChatMessage setImageToMessage(PushChatMessage tempPushChatMessage){
		String temp_url = "";
		//			try{
		//				temp_url = tempPushChatMessage.getFileUrl();
		//				if(!(temp_url==null||temp_url.length()<1||temp_url.equals("null"))){
		//					try{
		//						tempPushChatMessage.setUploadFileImg(LoadImage(temp_url));
		//					}catch(Exception e){
		//						e.printStackTrace();
		//					}
		//				}
		//			}catch(Exception e){
		//				e.printStackTrace();
		//			}
		try{
			temp_url = tempPushChatMessage.getThumbnailUrl();
			if(!(temp_url==null||temp_url.length()<1||temp_url.equals("null"))){
				try{
					tempPushChatMessage.setUploadFileThumbnailImg(LoadImage(temp_url, false));
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		//			try{
		//				temp_url = tempPushChatMessage.getProfileImageUrl();
		//				if(!(temp_url==null||temp_url.length()<1||temp_url.equals("null"))){
		//					try{
		//						tempPushChatMessage.setProfileImg(LoadImage(temp_url));
		//					}catch(Exception e){
		//						e.printStackTrace();
		//					}
		//				}
		//			}catch(Exception e){
		//				e.printStackTrace();
		//			}
		try{
			temp_url = tempPushChatMessage.getProfileThumbnailUrl();
			if(!(temp_url==null||temp_url.length()<1||temp_url.equals("null"))){
				if(!(tempPushChatMessage.getPushChatUserMemberId().equals(userId))){	// 상대방의 것만.
					//				if(!(tempPushChatMessage.getPushChatUserMemberId().equals(pushChatMember.getMemberId()))){	// 상대방의 것만.
					if(tmp_prevImageUrl.equals(temp_url)){	// 기존 것과 같으면 그대로 사용
						tempPushChatMessage.setProfileThumbnailImg(tmp_prevImage);
					}else{
						tmp_prevImageUrl = temp_url;		// 기존것과 다르다면 새로 조회
						tmp_prevImage = LoadImage(temp_url, true);
						tempPushChatMessage.setProfileThumbnailImg(tmp_prevImage);
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return tempPushChatMessage;
	}


	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////		


	/**
	 * 모토로이를 위해 서버에서 가져온 데이터를 pref 에 저장한다. - (사진 촬영후 기존 메모리 손실 이슈)
	 */
	public void saveServerDataToPreference(){
		SharedPreferences.Editor saveToPref = sharedPrefCustom.edit();
		saveToPref.putString("idUserFromServer", idUserFromServer);			   			
		saveToPref.putString("chatChatIdChatFromServer", chatChatIdChatFromServer);			
		saveToPref.putString("chatChatOwnerFromServer", chatChatOwnerFromServer);		
		saveToPref.commit();
	}
	/**
	 * 모토로이를 위해 서버에서 가져온 데이터를 pref 에서 꺼낸다.
	 */
	public boolean readServerDataFromPreference(){
		idUserFromServer = sharedPrefCustom.getString("idUserFromServer", "");	
		chatChatIdChatFromServer = sharedPrefCustom.getString("chatChatIdChatFromServer", "");	
		chatChatOwnerFromServer = sharedPrefCustom.getString("chatChatOwnerFromServer", "");
		if(idUserFromServer.length()>0){
			return true;
		}else {
			return false;
		}
	}


	/**
	 * titleChange
	 *  타이틀 변경 화면에 적용한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void titleChange(){
		//  가져온 데이터로 화면타이틀을 변경한다.
		ChatRoomActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("titleChange", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	//		/**
	//		 * showUploadImage
	//		 *  업로드 이미지 크게 보기
	//		 *
	//		 * @param
	//		 * @param
	//		 * @return
	//		 */
	//		public void showUploadImage(){
	//			//  가져온 데이터로 화면타이틀을 변경한다.
	//			ChatRoomActivity.this.runOnUiThread(new Runnable(){		 
	//				@Override
	//				public void run(){
	//					Message message = handler.obtainMessage();
	//					Bundle b = new Bundle();
	//					b.putInt("showUploadImage", 1);
	//					message.setData(b);
	//					handler.sendMessage(message);
	//				}
	//			});
	//		}

	/**
	 * showInfo
	 *  결과를 화면에 뿌려준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		hidePb();
		//  가져온 데이터 화면에 보여주기.
		ChatRoomActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("showYN", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * hideInfo
	 *  일단 화면을 숨긴다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hideInfo(){
		hidePb();
		ChatRoomActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("showYN", 2);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}


	/**
	 * returnThis
	 *  컨택스트 반환한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}

	// 이미지 처리
	// 가맹점 이미지 URL 에서 이미지 받아와서 도메인에 저장하는 부분.
	/**
	 * LoadImage
	 *  이미지 URL 에서 이미지 받아온 스트림을 비트맵으로 저장한다  + 라운딩 처리.
	 *
	 * @param $imagePath
	 * @param
	 * @return bm
	 */
	private Bitmap LoadImage( String $imagePath, boolean IMAGE_ROUND_SETTING ) {
		InputStream inputStream = OpenHttpConnection( $imagePath ) ;
		Bitmap bm = BitmapFactory.decodeStream( inputStream ) ;
		if(IMAGE_ROUND_SETTING){
			bm = commonUtil.getRoundedCornerBitmap(bm);	// 라운딩 처리
		}
		return bm;
	}
	/**
	 * OpenHttpConnection
	 *  이미지 URL 에서 이미지 받아와서 스트림으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return stream
	 */
	private InputStream OpenHttpConnection(String $imagePath) {
		// TODO Auto-generated method stub
		InputStream stream = null ;
		try {
			URL url = new URL( $imagePath ) ;
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection() ;
			urlConnection.setRequestMethod( "GET" ) ;
			urlConnection.connect() ;
			if( urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK ) {
				stream = urlConnection.getInputStream() ;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return stream ;
	}


	/*
	 * 핸들러 파트.
	 *  화면상의 변화가 있는 요청은 핸들러를 사용
	 */
	/**
	 * showMsg
	 *  화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	 *
	 * @param msg
	 * @param
	 * @return
	 */
	public void showMsg(final String msg){		
		ChatRoomActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showToast", 1);
				b.putString("msg", msg);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * showAlert
	 * 얼럿창을 띄운다
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showAlert(final String msg){
		ChatRoomActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * showMSG
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showMSG(){			// 화면에 error 토스트 띄움..
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 
	/**
	 * showResultDialog
	 *  (얼럿 띄운다)
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialog(final String msg){
		ChatRoomActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * confirmBlock
	 *  사용자 차단 확인받기
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void confirmBlock(){			 
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("confirmBlock", 1);
						b.putString("msg", getString(R.string.block_confirm));
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 
	/**
	 * initTextField
	 *  입력창 초기화
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void initTextField(){
		ChatRoomActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "initTextField" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		ChatRoomActivity.this.runOnUiThread(new Runnable(){		  
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		ChatRoomActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 2);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}

	/**
	 * 소프트키보드를 숨긴다.
	 */
	public void hideKeypad(){
		imm .hideSoftInputFromWindow(chatRoomTitle.getWindowToken(), 0);
	}


	//		/**
	//		 * onBackPressed
	//		 * @param
	//		 * @param
	//		 * @return
	//		 */
	@Override
	public void onBackPressed() {
		Log.i(TAG, "onBackPressed");
		SharedPreferences.Editor saveChatRoomStatusPref = sharedPrefCustom.edit();
		saveChatRoomStatusPref.putBoolean("chatRoomUsingYn", false);			   		// 채팅방 사용중. (푸시를 통한 리프레시 기능을 위해 필요)	
		saveChatRoomStatusPref.putString("currentChatRoomId", "");		//  위의 두 값이 바뀐후 리프레시한다면 채팅방이 바뀌는 효과.(타이틀도 바꿔야)
		saveChatRoomStatusPref.putString("currentChatRoomOwner", "");	//  그에 따른 변수도 함께 바껴야 (최초 조회 여부 관련) 	
		saveChatRoomStatusPref.commit();
		//			CommonConstant.chatRoomUsingYn = false;	
		//			CommonConstant.currentChatRoomId = "";
		//			CommonConstant.currentChatRoomOwner = "";
		super.onBackPressed();
		//			finish();
	}
	@Override
	public void onDestroy(){
		Log.i(TAG, "finish");
		//				CommonConstant.chatRoomUsingYn = false;	
		//				CommonConstant.currentChatRoomId = "";
		//				CommonConstant.currentChatRoomOwner = "";
		super.onDestroy();
		//			finish();
	}
}
